#include <iostream>
#include <windows.h>
#include <vector>
#include <cmath> // 对标准库中的数学函数的说明
#include <cstdlib>
// #include <math.h>

using namespace std;

// 类型重定义
typedef double newDouble;
using newInt = int;

// 枚举类型 不限定作用域
enum Weekday
{
    SUN,
    MON,
    TUE,
    THU,
    FRI,
    SAT
};

enum GameResult 
{
    WIN,
    LOSE,
    TIE,
    CANCEL
};

double power(double x, int n) {
    double val = 1.0;
    while (n--) {
        val *= x;
    }
    return val;
}

double arctan(double x) {
    double sqr = x * x;
    double e = x;
    double r = 0;
    int i = 1;
    while (e / i > 1e-15)
    {
        /* code */
        double f = e / i;
        r = (i % 4 == 1) ? r + f : r - f;
        e = e * sqr;
        i += 2;
    }
    return r;
}

// 判断 n 是否回文数
bool symm(unsigned n) {
    unsigned i = n;
    unsigned m = 0;
    while (i > 0) {
        m = m * 10 + i % 10;
        i /= 10;
    }
    return m == n;
}

const double TINY_VALUE = 1e-10;

double tsin(double x) {
    double g = 0;
    double t = x;
    int n = 1;
    do {
        g += t;
        n++;
        t = -t * x * x / (2 * n - 1) / (2 * n - 2);
    } while (fabs(t) >= TINY_VALUE);
    return g;
}

enum GameStatus
{
    WIN2,
    LOSE2,
    PLAYING    
};

// 投骰子，计算和数、输出和数
int rollDice() {
    int die1 = 1 + rand() % 6;
    int die2 = 1 + rand() % 6;
    int sum = die1 + die2;
    cout << "palyer rolled " << die1 << " + " << die2 << " = " << sum << endl;
    return sum;
}

unsigned fac(int n) {
    unsigned f;
    if (n == 0) {
        f = 1;
    } else {
        f = fac(n - 1) * n;
    }
    return f;
}


int comm(int n, int k) {
    if (k > n) {
        return 0;
    } else if (n == k || k == 0) {
        return 1;
    } else {
        return comm(n - 1, k) + comm(n - 1, k - 1);
    }
}

// 将 src 针的最上面一个盘子移到 dest 针上
void move(char src, char dest) {
    cout << src << " --> " << dest << endl;
}
// 将 n 个盘子从 src 针移动到 dest 针，以 medium 针作为中转
void hanoi(int n, char src, char medium, char dest) {
    if (n == 1) {
        move(src, dest);
    } else {
        hanoi(n - 1, src, dest, medium);
        move(src, dest);
        hanoi(n - 1, medium, src, dest);
    }
}

// 交换两个整数（引用传递）
void swap(int& a, int& b) {
    int t = a;
    a = b;
    b = t;
}


const double PI = 3.141592653589793;
// 内联函数
// 编译时在调用处用函数体进行替换，节省了参数传递、控制转移等开销。
// 注意
//      内联函数体内不能有循环语句和 switch 语句
//      内联函数的定义必须出现在内联函数第一次被调用之前
//      对内联函数不能进行异常接口声明
inline double calArea(double radius) {
    return PI * radius * radius;
}


// constexpr 函数
// constexpr 修饰的函数在其所有参数都是 constexpr 时，一定返回 constexpr
// 函数体中必须有且仅有一条 return 语句
constexpr int get_size() {
    return 20;
}

// 带默认参数值的函数
int add(int x, int y = 5, int z = 6) {
    return x + y + z;
}


// 函数重载，分别计算两个整数平方和及两实数平方和
// 重载函数的形参必须不同:个数不同或类型不同
int sumOfSquare(int a, int b) {
    return a * a + b * b;
}
double sumOfSquare(double a, double b) {
    return a * a + b * b;
}

int main() {





    // // foo 是一个常量表达式
    // // 编译时可以被计算出结果，编译时进行初始化
    // constexpr int foo = get_size();


    // double r = 3.0;
    // double area = calArea(r);
    // cout << area << endl;




    // int m;
    // cout << "Enter the number of diskes: ";
    // cin >> m;
    // cout << "the steps to moving " << m << " diskes:" << endl;
    // hanoi(m, 'A', 'B', 'C');




    // // 用递归法计算从 n 个人中选选 k 个人组成一个委员会的不同组合数。
    // int n, k;
    // cout << "Please enter two integers n and k: ";
    // cin >> n >> k;
    // cout << "C(n, k) = " << comm(n, k) <<endl;




    // // 计算阶乘
    // unsigned n;
    // cout << "Enter a positive integer: ";
    // cin >> n;
    // unsigned y = fac(n);
    // cout << n << "!= " << y <<endl;




    // int sum, myPoint;
    // GameStatus status;
    // unsigned seed;
    // int rollDice();
    // cout << "Please enter an unsigned integer: ";
    // cin >> seed;// 输入随机数种子
    // srand(seed);// 将种子传递给 rand()
    // sum = rollDice();// 第一轮投骰子，计算和数
    // switch (sum)
    // {
    // case 7:// 如果和数为 7 或 11 则为胜，状态为WIN
    // case 11:
    //     status = WIN2;
    //     break;
    // case 2:// 和数为 2、3 或 12 则为负，状态为 LOSE
    // case 3:
    // case 12:
    //     status = LOSE2;
    //     break;
    // default:// 其它情况，尚无结果，状态为 PLAYING，记下点数
    //     status = PLAYING;
    //     myPoint = sum;
    //     cout << "point is " << myPoint << endl;
    //     break;
    // }
    
    // while (status == PLAYING) {
    //     // 只要状态为 PLAYING，继续
    //     sum = rollDice();
    //     if (sum == myPoint) {
    //         // 某轮的和数等于点数则取胜
    //         status = WIN2;
    //     } else if (sum == 7) {
    //         // 出现和数为 7 则为负
    //         status = LOSE2;
    //     }
    // }

    // // 当状态不为 PLAYING 时循环结束，输出游戏结果
    // if (status == WIN2) {
    //     cout << "player wins" << endl;
    // } else {
    //     cout << "player loses" << endl;
    // }





    // double k, r, s;
    // cout << "r = ";
    // cin >> r;
    // cout << "s = ";
    // cin >> s;
    // if (r * r <= s * s) {
    //     k = sqrt(tsin(r)*tsin(r)+tsin(s)*tsin(s));
    // } else {
    //     k = tsin(r * s) / 2;
    // }
    // cout << k << endl;




    // for (unsigned m = 11; m < 1000; m++) {
    //     if (symm(m) && symm(m * m) && symm(m * m * m)) {
    //         cout << "m = " << m;
    //         cout << " m * m = " << m * m;
    //         cout << " m * m * m = "
    //             << m * m * m << endl;
    //     }
    // }



    // double a = 16.0 * arctan(1 / 5.0);
    // double b = 4.0 * arctan(1 / 239.0);
    // cout << "PI = " << a - b <<endl;



    // double pow;
    // pow = power(5, 2);
    // cout << pow << endl;


    // GameResult result;
    // enum GameResult omit = CANCEL;
    // for (int count = WIN; count <= CANCEL; count++)
    // {
    //     result = GameResult(count);
    //     if (result == omit)
    //     {
    //         cout << "The game cnacelled" << endl;
    //     }
    //     else
    //     {
    //         cout << "The game was played ";
    //         if (result == WIN)
    //         {
    //             cout << "and we won!";
    //         }
    //         if (result == LOSE)
    //         {
    //             cout << "and we lost.";
    //         }
    //         cout << endl;
    //     }
    // }


    // auto: 编译器通过初始值自动推断变量类型
    // decltype: 定义一个变量与某一表达式的类型相同，但并不用该表达式初始化变量





    // cout << "hello world!" << endl;
    // vector<int> a;
    // a.push_back(5);
    // cout << a[0] << endl;
    // cout << sizeof(short) << endl;
    // system("pause");

    // short b = 1;
    // int c = (int)b;// 转换类型
    // int d = int(b);// 转换类型
    // int e = static_cast<int>(b);// 转换类型


    // cout << "size of an long is " << sizeof(long) << " bytes \n";

    // unsigned int x;
    // int x;
    // unsigned y = 100;
    // unsigned z = 50;

    // x = y - z;
    // cout << "difference is " << x << endl;
    // x = z - y;
    // cout << "new difference is " << x << endl;

    // int a, b, c;
    // cout << "input value of a: \n";
    // cin >> a;
    // cout << a;

    // int day;
    // cin >> day;
    // switch (day) {
    //     case 0:
    //         cout << "Sunday" << endl;
    //         break;
    //     case 1:
    //         cout << "Monday" << endl;
    //         break;
    //     case 2:
    //         cout << "Tuesday" << endl;
    //         break;
    //     case 3:
    //         cout << "Wednesday" << endl;
    //         break;
    //     case 4:
    //         cout << "Thursday" << endl;
    //         break;
    //     case 5:
    //         cout << "Friday" << endl;
    //         break;
    //     case 6:
    //         cout << "Saturday" << endl;
    //         break;
    //     default:
    //         cout << "Day out of range Sunday...Saturday" << endl;
    //         break;
    // }


    // int i = 1, sum = 0;
    // while (i <= 10) {
    //     sum += 1;
    //     i++;
    // }
    // cout << "sum = " << sum << endl;



    // int n, right_digit, newnum = 0;
    // cout << "Enter the number: ";
    // cin >> n;
    // cout << "The number in reverse order is ";
    // do {
    //     right_digit = n % 10;
    //     cout << right_digit;
    //     n /= 10;
    // } while (n != 0);
    // cout << endl;

    // int i = 1, sum = 0;
    // do {
    //     sum += i;
    //     i++;
    // } while (i <= 10);
    // cout << "sum = " << sum << endl;

    // int n;
    // cout << "Enter a positive integer: ";
    // cin >> n;
    // cout << "Number " << n << " Factors";
    // for (int k = 1; k <= n; k++) {
    //     if (n % k == 0) {
    //         cout << k << " ";
    //     }
    // }
    // cout << endl;



    system("pause");



    return 0;
}